package com.web.service.Impl;

import com.web.dao.DeviceDao;
import com.web.pojo.domain.Device;
import com.web.pojo.domain.DeviceWorkParameters;
import com.web.pojo.dto.*;
import com.web.service.DeviceServer;
import com.web.utils.SecurityUtils;
import com.web.utils.ToolUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class DeviceServerImpl implements DeviceServer {

    @Autowired
    DeviceDao deviceDao;

    /**
     * 添加设备信息
     * @param device
     * @return
     */
    @Override
    public Integer insertDevice(Device device) {
        Integer rows = deviceDao.insertDevice(device);
        Integer userId = SecurityUtils.getUserId();
        deviceDao.insertUserDevice(userId, device.getDeviceId());
        return rows;
    }

    @Override
    public Device getDevice(String dev_eui) {
        return null;
    }

    /**
     * 检查设备eui是否重复
     * @param deviceEui 设备eui
     * @return 结果
     */
    @Override
    public Boolean checkDeviceEuiUnique(String deviceEui) {
        Integer count = deviceDao.checkDeviceEuiUnique(deviceEui);
        return count > 0 ? false : true;
    }


    /**
     * 检查设备addr是否重复
     * @param deviceAddr 设备addr
     * @return 结果
     */
    @Override
    public Boolean checkDeviceAddrUnique(String deviceAddr) {
        Integer count = deviceDao.checkDeviceAddrUnique(deviceAddr);

        return count > 0 ? false : true;
    }

    /**
     * 修改设备信息
     * @param device 设备信息
     * @return 结果
     */
    @Override
    public Integer updateDevice(Device device) {
        return deviceDao.updateDevice(device);
    }

    /**
     * 删除设备想
     * @param updateBy 删除者
     * @param deviceIds 设备Id
     * @return 结果
     */
    @Override
    public Integer deleteDevice(String updateBy, List<Integer> deviceIds) {
        return deviceDao.deleteDevice(updateBy, deviceIds);
    }

    /**
     * 查看设备详情
     * @param deviceId 设备id
     * @return 结果
     */
    @Override
    public Device selectDeviceDetails(Integer deviceId) {
        return deviceDao.selectDeviceDetails(deviceId);
    }

    /**
     * 查看设备列表
     * @param userId
     * @param str 查询条件
     * @return 结果
     */
    @Override
    public List<Device> selectDeviceList(Integer userId, String str) {
        return deviceDao.selectDeviceList(userId, str);
    }

    /**
     * 根据地址查询设备
     * @param userId 用户id
     * @param addressId 地址
     * @return 结果
     */
    @Override
    public List<Device> selectDeviceListByAddressId(Integer userId, Integer addressId) {
        return deviceDao.selectDeviceListByAddressId(userId, addressId);
    }

    /**
     * 根据设备eui查询设备
     * @param deviceEui 设备eui
     * @return 结果
     */
    @Override
    public Device selectDeviceByDeviceEui(String deviceEui) {
        return deviceDao.selectDeviceByDeviceEui(deviceEui);
    }

    /**
     * 查看设备工作参数
     * @param deviceId 设备id
     * @return 结果
     */
    @Override
    public DeviceWorkParameters selectDeviceWorkParameters(Integer deviceId) {
        return deviceDao.selectDeviceWorkParameters(deviceId);
    }

    /**
     * 根据设备addr查询设备
     * @param deviceAddr 设备eui
     * @return 结果
     */
    @Override
    public Device selectDeviceByDeviceAddr(String deviceAddr) {
        return deviceDao.selectDeviceByDeviceAddr(deviceAddr);
    }

    /**
     * 设备入网
     * @param deviceId 设备id
     * @param NwkSKey NwkSKey
     * @param AppSKey AppSKey
     * @param gateWayEui 网关Eui
     * @return 结果
     */
    @Override
    public Integer deviceJoin(Integer deviceId, byte[] NwkSKey, byte[] AppSKey, byte[] gateWayEui) {
        String NwkSKeyStr = ToolUtil.printHexBinary(NwkSKey);
        String AppSKeyStr = ToolUtil.printHexBinary(AppSKey);
        String GateWayEuiStr = ToolUtil.printHexBinary(gateWayEui);
//        deviceDao.insertDeviceWorkParameters(deviceId);
        return deviceDao.deviceJoin(deviceId, NwkSKeyStr, AppSKeyStr, GateWayEuiStr);
    }

    /**
     * 根据id列表查询设备信息
     * @param deviceIds
     * @return
     */
    @Override
    public List<Device> selectDeviceListByIds(List<Integer> deviceIds) {
        return deviceDao.selectDeviceListByIds(deviceIds);
    }

    /**
     * 查询已经入网的设备
     * @param dto 条件
     * @return 结果
     */
    @Override
    public List<Device> selectRegisteredDeviceByAddressId(SelectRegisteredDeviceDTO dto) {
        return deviceDao.selectRegisteredDeviceByAddressId(dto);
    }

    /**
     * 更新设备开关状态信息
     * @param dto 开关状态
     * @return 结果
     */
    @Override
    public Integer updateDeviceSwitchState(SetSwitchStateDTO dto) {
        return deviceDao.updateDeviceSwitchState(dto);
    }

    /**
     * 更新设备开关控制状态信息
     * @param dto 开关控制状态
     * @return 结果
     */
    @Override
    public Integer updateDeviceSwitchControlState(SetSwitchControlStateDTO dto) {
        return deviceDao.updateDeviceSwitchControlState(dto);
    }

    /**
     * 更新设备开关调关等级信息
     * @param dto 调关等级信息
     * @return 结果
     */
    @Override
    public Integer updateDeviceSwitchDimmingLevel(SetSwitchDimmingLevelDTO dto) {
        return deviceDao.updateDeviceSwitchDimmingLevel(dto);
    }

    /**
     * 更新设备上报周期信息
     * @param dto 上报周期信息
     * @return 结果
     */
    @Override
    public Integer updateDeviceSwitchReportingPeriod(SetSwitchReportingPeriodDTO dto) {
        return deviceDao.updateDeviceSwitchReportingPeriod(dto);
    }
    /**
     * 设备授权
     * @param ids 授权的Id
     * @param userId 用户id
     * @return 结果
     */
    @Override
    public Integer authorizeDevice(List<Integer> ids, Integer userId) {
        return deviceDao.authorizeDevice(ids,userId);
    }

    /**
     * 更改时间表信息
     * @param dto 时间表信息
     * @return 结果
     */
    @Override
    public Integer replaceDeviceSwitchSchedule(SetSwitchScheduleDTO dto) {
        return deviceDao.replaceDeviceSwitchSchedule(dto);
    }
}
